home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / artemis1 / src / saveload.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-14  |  10.3 KB  |  449 lines

  1. /*
  2.     ARTemis (Graphic Editor for FM-TOWNS)
  3.     (c) MATSUUCHI Ryosuke 1992,1993
  4.  
  5.     saveload.c
  6. */
  7.  
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <dos.h>
  12. #include <malloc.h>
  13. #include <mos.h>
  14. #include <egb.h>
  15. #include <stdlib.h>
  16.  
  17. #include "ge.h"
  18. #include <direct.h>
  19. #include "plt16.h"
  20. #include "dispman.h"
  21. #include "imageman.h"
  22. #include "mask.h"
  23.  
  24.  
  25. static TIFFinfo    tiffinfo;        // ロードするTIFFファイルに関する情報
  26. static int loadtype;  // 読み込み方式
  27.  
  28. enum {SAVE_ALL, SAVE_PART};
  29. static    int        savetype;
  30. static     int        savex1,savey1,savex2,savey2;
  31. static    int        loadx,loady;
  32. static    int        loadxlen,loadylen;
  33.  
  34. /*--------------------------------------------------------*/
  35. /*                ファイルに関する補助処理                */
  36. /*--------------------------------------------------------*/
  37.  
  38.  
  39. static bool fexist(char *fname)
  40. {
  41.     FILE *fp;
  42.     if ((fp = fopen(fname,"r")) == NULL)
  43.         return NO;
  44.     fclose(fp);
  45.     return YES;
  46. }
  47.  
  48.  
  49. static int checkFileFormat(char *filename)
  50. // ★ファイルのフォーマットの判断
  51. // -1: ファイルがオープンできない
  52. // 0 : TIFF
  53. // 2 : ベタ
  54. // 3 : MAG
  55. {
  56.     char buf[100];
  57.     FILE *fp;
  58.     if ((fp = fopen(filename,"rb")) == NULL)
  59.         return -1;
  60.     fread(buf, 1,100, fp);
  61.     fclose(fp);
  62.     static char headTIFF[] = {0x49,0x49,0x2a,0x00};
  63.     static char headMAG[] = {'M','A','K','I','0','2',' ',' '};
  64.     if (memcmp(buf,headTIFF,4) == 0)
  65.         return 0;
  66.     else if (memcmp(buf,headMAG,8) == 0)
  67.         return 3;
  68.     else
  69.         return 2;
  70. }
  71.  
  72.  
  73. /*--------------------------------------------------------*/
  74. /*                ファイルのセーブ・ロード                 */
  75. /*--------------------------------------------------------*/
  76.  
  77.  
  78. #define    DISKBUF    50000    /* グラフィックデータを格納するバッファのサイズ */
  79.  
  80.  
  81. // ● ベタ形式でのセーブ・ロード
  82.  
  83.  
  84. static void BETASave(char *fname)
  85. {
  86.     FILE *fp;  char *savebuf;  int y,yu;
  87.     if ((savebuf = malloc(DISKBUF)) == NULL)
  88.         { PRINT("ベタ形式セーブ用ワーク 確保失敗\n"); return; }
  89.     else
  90.         PRINT("ベタ形式セーブ用ワーク 確保成功\n");
  91.     if ((fp = fopen(fname, "wb")) == NULL)
  92.         return;
  93.     int x0,y0,xlen,ylen;
  94.     if (savetype == SAVE_ALL)
  95.         x0=y0=0,xlen=EIMgetxsize(),ylen=EIMgetysize();
  96.     else
  97.         x0=savex1,y0=savey1,xlen=savex2-savex1+1,ylen=savey2-savey1+1;
  98.     yu = DISKBUF / (xlen*2);        // 一回に転送するライン数
  99.     for (y = 0;  y < ylen;  y += yu)
  100.     {
  101.         int yl;    // 今回のループ内処理でセーブする領域のライン数
  102.         yl = _min(yu, ylen-y);
  103.         EIMgetblock(savebuf, x0, y0+y, xlen, yl);
  104.         fwrite(savebuf, 1, xlen*yl*2, fp);
  105.     }
  106.     fclose(fp);
  107.     free(savebuf);
  108. }
  109.  
  110.  
  111. static void BETALoad(char *fname)
  112. {
  113.     FILE *fp;  char *loadbuf;  int y,yu;
  114.     if ((loadbuf = malloc(DISKBUF)) == NULL)
  115.     {
  116.         DEBUG_MSG("ベタ形式ロード用ワーク 確保失敗");
  117.         return;
  118.     }
  119.     else
  120.         DEBUG_MSG("ベタ形式ロード用ワーク 確保成功");
  121.     if ((fp = fopen(fname, "rb")) == NULL)
  122.         return;
  123.     yu = DISKBUF / (EIMgetxsize()*2);
  124.     for (y = 0;  y < EIMgetysize();  y += yu)
  125.     {
  126.         int yl;  // 今回のループ内処理でロードする領域のライン数
  127.         yl = _min(yu, EIMgetysize()-y);
  128.         fread(loadbuf, 1, EIMgetxsize()*yl*2, fp);
  129.         EIMputblock(0, y, EIMgetxsize(), yl, loadbuf, DrawNORMAL);
  130.     }
  131.     fclose(fp);
  132.     free(loadbuf);
  133. }
  134.  
  135.  
  136. static int readEditBuf(char *buf, int yofs, int ylen)
  137. {
  138.     if (savetype == SAVE_ALL)
  139.         EIMgetblock(buf, 0,yofs, EIMgetxsize(), ylen);
  140.     else
  141.         EIMgetblock(buf, savex1,savey1+yofs, savex2-savex1+1, ylen);
  142.     return 0;
  143. }
  144.  
  145.  
  146. static int writeEditBuf(char *buf, int yofs, int ylen)
  147. {
  148.     int mosdisp = MOS_getDisp(NULL,NULL) & 0xff;
  149.     if (mosdisp)
  150.         MOS_disp(0);
  151.     if (loadtype == 0)
  152.         { MOFF;
  153.           EIMputblock(loadx,loady+yofs,loadxlen,ylen, buf,DrawNORMAL);
  154.           MON; }
  155.     else
  156.         matte_putblock(loadx,loady+yofs,loadxlen,ylen, buf,blkop);
  157.     if (mosdisp)
  158.         MOS_disp(1);
  159.     return 0;
  160. }
  161.  
  162.  
  163. // ● 種々の形式でセーブ・ロードする
  164.  
  165.  
  166. static void SaveScreen(char *fname[], int format)
  167. {
  168.     int r;
  169.     char pathbuf[_MAX_PATH];
  170.     add_fname_ext(pathbuf, fname[0],
  171.                   (format==0||format==1 ? "TIF" : "VRM"));
  172.     if (fexist(pathbuf))
  173.     {
  174.         char strbuf[200];
  175.         sprintf(strbuf, "ファイル\"%s\"がすでに存在します。"
  176.                         "上書きしてよいですか?", pathbuf);
  177.         if (check_yes_no(strbuf) != 0)
  178.             return;
  179.     }
  180.     switch (format)
  181.     {
  182.     case 0:
  183.     case 1:
  184.         if (!DMgetifonepage())
  185.             mous_type(2,moscsr_timer());
  186.         else
  187.             { MOS_resolution(0,17); mous_typeRom(82); }
  188.         MOS_disp(1);
  189.         page_edit();  // TIFFsave をダマすために必須
  190.         TIFFsave_getimagefunc(readEditBuf);
  191.         if (savetype == SAVE_ALL)
  192.             r = TIFFsave( pathbuf, 0, 0, EIMgetxsize(),EIMgetysize(),
  193.                           (format==0?YES:NO) );
  194.         else
  195.             r = TIFFsave( pathbuf, savex1, savey1,
  196.                           savex2-savex1+1, savey2-savey1+1,
  197.                           (format==0 ? YES:NO) );
  198.         page_menu();
  199.         MOS_disp(0);
  200.         if (DMgetifonepage())
  201.             MOS_resolution(0,3);
  202.         break;
  203.     case 2:    // ベタ
  204.         page_edit();
  205.         BETASave(pathbuf);
  206.         r = 0;
  207.         page_menu();
  208.         break;
  209.     }
  210.     if ((format==0||format==1) && r!=0)
  211.     {
  212.         switch (r)
  213.         {
  214.         case -1: dispAttentionMsg("ファイル名が異常です");           break;
  215.         case -2: dispAttentionMsg("作業のためのメモリが足りません"); break;
  216.         case -3: dispAttentionMsg("ディスクの残り容量が足りません"); break;
  217.         default: dispAttentionMsg("TIFFsave 関数エラー");
  218.         }
  219.     }
  220. }
  221.  
  222.  
  223. static void LoadScreen(char *fname[], int _loadtype)
  224. {
  225.     loadtype = _loadtype;
  226.     int f;
  227.     if ((f = checkFileFormat(fname[0])) == -1)
  228.         { dispAttentionMsg("ファイルがありません!");  return; }
  229.     loadx = loady = 0;
  230.     if (f == 0)
  231.     {
  232.         if (TIFFgetinfo(fname[0], &tiffinfo) == 0)
  233.             loadxlen = tiffinfo.xlen,  loadylen = tiffinfo.ylen;
  234.         else
  235.             { dispAttentionMsg("TIFFファイル形式が異常です!?");  return; }
  236.     }
  237.     else
  238.         loadxlen = EIMgetxsize(),  loadylen = EIMgetysize();
  239.     if ( f == 0 && use_loadmove &&
  240.          ( loadxlen <= EIMgetxsize() && loadylen <= EIMgetysize() )
  241.          && ! (loadxlen == EIMgetxsize() && loadylen == EIMgetysize() ) )
  242.     {
  243.         int lat2xlen,lat2ylen;
  244.         DMimage_getlatticesize(&lat2xlen,&lat2ylen);
  245.         void drawcsr(int msx,int msy)
  246.         {
  247.             MOFF;
  248.             int tx=DMimage_getx(msx), ty=DMimage_gety(msy);
  249.             if (areaadj)
  250.                 tx = tx - tx % lat2xlen, ty = ty - ty % lat2ylen;
  251.             EIMrboxline(tx,ty,loadxlen,loadylen,white,DrawXOR);
  252.             MON;
  253.         }
  254.         int zr = DMimage_getzoomrate();
  255.         scrollForCsr(loadxlen*zr,loadylen*zr);
  256.         for (;;)
  257.         {
  258.             int prex,prey;
  259.             if (areaadj)
  260.                 DMdispcsr(ms.x,ms.y);
  261.             drawcsr((prex=ms.x),(prey=ms.y));
  262.             do {
  263.                 ms_get(&ms);
  264.             } while (ms.dx==0 && ms.dy==0 && ms.btn1==OFF && ms.btn2==OFF &&
  265.                      key_chk() == 0);
  266.             if (areaadj)
  267.                 DMerasecsr();
  268.             drawcsr(prex,prey);        // 消去
  269.             scrollForCsr(loadxlen*zr,loadylen*zr);
  270.             if (ms.btn1 == OFFON)
  271.             {
  272.                 loadx = DMimage_getx(ms.x),  loady = DMimage_gety(ms.y);
  273.                 if (areaadj)
  274.                     loadx -= loadx % lat2xlen,  loady -= loady % lat2ylen;
  275.                 break;
  276.             }
  277.             if (ms.btn2 == OFFON)
  278.                 goto NOLOAD;
  279.         }
  280.     }
  281.     switch(f)
  282.     {
  283.     case 0:
  284.         if (!DMgetifonepage())
  285.             mous_type(2,moscsr_timer());
  286.         else
  287.             { MOS_resolution(0,17);  mous_typeRom(82); }
  288.         MOS_disp(1);
  289.         page_edit();
  290.         if (TIFFgetinfo(fname[0], &tiffinfo) == 0)
  291.             { TIFFload_putimagefunc(writeEditBuf);
  292.               TIFFload(fname[0],0,0); }
  293.         page_menu();
  294.         MOS_disp(0);
  295.         if (DMgetifonepage())
  296.             MOS_resolution(0,3);
  297.         break;
  298.     case 2:
  299.         page_edit();
  300.         BETALoad(fname[0]);
  301.         page_menu();
  302.         break;
  303.     case 3:
  304.         page_edit();
  305.         MAG_easyLoad(fname[0]);
  306.         EIMbackup();
  307.         page_menu();
  308.         break;
  309.     }
  310.     if (mode == MODE16)
  311.         plt16_init();
  312.     NOLOAD:
  313.     ;
  314. }
  315.  
  316.  
  317. /*--------------------------------------------------------*/
  318. /*                      画像のセーブ                      */
  319. /*--------------------------------------------------------*/
  320.  
  321.  
  322. #include "saveload.md"
  323.  
  324. #define    S(id)    menu_selector(&savemenu,id)
  325. #define    B(id)    menu_scrollbar(&savemenu,id)
  326.  
  327. static void SETBAR(int id, int allsize, int dispsize)
  328. {
  329.     SCROLLBAR *bp = B(id);
  330.     menu_scrollbar_setallsize(bp, allsize);
  331.     menu_scrollbar_setdispsize(bp, dispsize);
  332. }
  333.  
  334. void commandSave()
  335. {
  336.     if (!use_partsave)
  337.     {
  338.         savetype = SAVE_ALL;
  339.         goto NOMENU;
  340.     }
  341.     int xmax,ymax;
  342.     xmax = EIMgetxsize()-1, ymax = EIMgetysize()-1;
  343.     SETBAR(barSAVESTARTX, xmax+(xmax/7), xmax/7);
  344.     SETBAR(barSAVESTARTY, ymax+(ymax/7), ymax/7);
  345.     SETBAR(barSAVEENDX, xmax+(xmax/7), xmax/7);
  346.     SETBAR(barSAVEENDY, ymax+(ymax/7), ymax/7);
  347.     static bool inibarvar = NO;
  348.     if (!inibarvar)
  349.     {
  350.         inibarvar = YES;
  351.         menu_scrollbar_setvar(B(barSAVESTARTX),0);
  352.         menu_scrollbar_setvar(B(barSAVESTARTY),0);
  353.         menu_scrollbar_setvar(B(barSAVEENDX),xmax);
  354.         menu_scrollbar_setvar(B(barSAVEENDY),ymax);
  355.     }
  356.     menu_disp(&savemenu);
  357.     for (;;)
  358.     {
  359.         DMdispcsr(ms.x,ms.y);
  360.         do { ms_get(&ms); }
  361.         while (ms.dx==0 && ms.dy==0 && ms.btn1==OFF && ms.btn2==OFF &&
  362.                key_chk()==0);
  363.         DMerasecsr();
  364.         scrollForCsr(1,1);
  365.         if (ms.btn1 == OFFON)
  366.         {
  367.             int a; SCROLLBAR *sbarp; int ax,ay;
  368.             a = menu_where(ms.x,ms.y,&savemenu, &ax,&ay,&sbarp);
  369.             switch(a)
  370.             {
  371.             case itemMoveMenu:
  372.                 menu_move();
  373.                 break;
  374.             case itemScrollBar:
  375.                 menu_touchscrollbar(sbarp, ax,ay);
  376.                 break;
  377.             case itemSelector:
  378.                 menu_touchselector(&savemenu);
  379.                 break;
  380.             case btnSAVEAREA:
  381.                 menu_erase();
  382.                 if (area_input(AREA_BOX) == 0)
  383.                 {
  384.                     int ax1,ay1,ax2,ay2;
  385.                     area_getboundxy(&ax1,&ay1,&ax2,&ay2);
  386.                     menu_scrollbar_setvar(B(barSAVESTARTX), ax1);
  387.                     menu_scrollbar_setvar(B(barSAVESTARTY), ay1);
  388.                     menu_scrollbar_setvar(B(barSAVEENDX), ax2);
  389.                     menu_scrollbar_setvar(B(barSAVEENDY), ay2);
  390.                 }
  391.                 menu_disp(&savemenu);
  392.                 break;
  393.             case btnSAVEEXEC:
  394.                 menu_erase();
  395.                 goto ENDLOOP;
  396.             case btnSAVECANCEL:
  397.                 menu_erase();
  398.                 goto NOSAVE;
  399.             }
  400.         }
  401.         else if (ms.btn2 == OFFON)
  402.         {
  403.             menu_erase();
  404.             goto NOSAVE;
  405.         }
  406.     }
  407.     ENDLOOP:
  408.     savetype = (menu_selector_getvar(S(selSAVETYPE))==0? SAVE_ALL: SAVE_PART);
  409.     #define BVAR(id) menu_scrollbar_getvar(B(id))
  410.     savex1 = BVAR(barSAVESTARTX);
  411.     savey1 = BVAR(barSAVESTARTY);
  412.     savex2 = BVAR(barSAVEENDX);
  413.     savey2 = BVAR(barSAVEENDY);
  414.     if (savex1 > savex2) swap(savex1,savex2);
  415.     if (savey1 > savey2) swap(savey1,savey2);
  416.     #undef BVAR
  417. NOMENU:
  418.     static char *xi[] =
  419.     {
  420.         "ファイル形式",
  421.         "[.TIF] 圧縮TIFF",
  422.         "[.TIF] 非圧縮TIFF",
  423.         "[.VRM] ベタ",
  424.         NULL
  425.     };
  426.     file_menu_exp("画像をディスクへ保存する", SaveScreen, xi);
  427.     NOSAVE:
  428.     return;
  429. }
  430.  
  431. #undef B
  432. #undef S
  433.  
  434.  
  435. void commandLoad()
  436. {
  437.     static char *xi[] =
  438.     {
  439.         "読み込み方式",
  440.         "通常ロード",
  441.         "演算ロード",
  442.         NULL
  443.     };
  444.     file_menu_exp("画像をディスクから読み込む", LoadScreen,xi);
  445. }
  446.  
  447.  
  448. /* end of saveload.c */
  449.